package com.yinxin.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 重点
 * 反射拿到一个类的属性(指定和所有)、方法(指定和所有)、构造器(指定和所有)
 */
public class GetClassInfo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class userClazz = Class.forName("com.yinxin.reflection.User");
        //获得类名
        System.out.println(userClazz.getName());
        System.out.println(userClazz.getSimpleName());
        System.out.println("=================================");
        //获得类的属性
//        Field[] fields = userClazz.getFields();//没打印出User类的属性，因为此方法只能打印公有属性
//        fields = userClazz.getDeclaredFields();//打印出了User类的属性，打印出所有属性
//        for (Field field : fields) {
//            System.out.println(field);
//        }
        //获得指定属性的值
//        Field name = userClazz.getDeclaredField("name");
//        System.out.println(name);
        //获得类的方法
//        System.out.println("=================================");
//        for (Method method : userClazz.getMethods()) {//所有本类方法以及其父类方法
//            System.out.println(method);
//        }
        //获得指定类的方法
//        System.out.println(userClazz.getDeclaredMethod("getName"));//指定类的方法
        System.out.println("================================");
        //获得构造器
        Constructor[] constructors = userClazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        //获得指定的构造方法
        Constructor constructor = userClazz.getConstructor(int.class, String.class, String.class);
        System.out.println(constructor);
    }
}
